#include "menuwizard.h"
#include "ui_menuwizard.h"

MenuWizard::MenuWizard(QWidget *parent) : QDialog(parent), ui(new Ui::MenuWizard)
{
    inserted = false;
    ui->setupUi(this);
    setFixedSize(500,300);

    ui->tableWidget->setFixedWidth(480);
    ui->tableWidget->setColumnWidth(0, 380);
    ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed);
}

MenuWizard::~MenuWizard()
{
    delete ui;
}

void MenuWizard::closeEvent(QCloseEvent *e)
{
    if(ui->tableWidget->rowCount() > 0 && !inserted)
    {
        QMessageBox::StandardButton choice = QMessageBox::warning(this, tr("Fermer l'assistant"), tr("De nouvelles entrées ont été créées. Êtes-vous sûr de vouloir fermer ?"), QMessageBox::Yes | QMessageBox::No);
        (choice == QMessageBox::Yes) ? e->accept() : e->ignore();
    }
}

void MenuWizard::on_btnAdd_clicked()
{
    int rowNb = ui->tableWidget->rowCount();
    ui->tableWidget->insertRow(rowNb); /* Ligne vide */

    /* Création & attribution des cellules */
    QTableWidgetItem *cel0 = new QTableWidgetItem;
    ui->tableWidget->setItem(rowNb, 0, cel0);

    QTableWidgetItem *cel1 = new QTableWidgetItem;
    ui->tableWidget->setItem(rowNb, 1, cel1);
}

void MenuWizard::on_tableWidget_cellDoubleClicked(int row, int column)
{
    if(column == 1) /* Colonne des labels */
    {
        if(ui->tableWidget->currentItem()) /* Est-ce que la cellule a été créée ? */
        {
            if(ui->tableWidget->currentItem()->text().isEmpty()) /* Si rien n'a été saisi : pré-initialisation avec L_ */
            {
                QTableWidgetItem *currItem = new QTableWidgetItem("L_");
                ui->tableWidget->setItem(row, column, currItem);
            }
        }
    }
}

void MenuWizard::on_bntDelete_clicked()
{
    if(ui->tableWidget->currentItem())
        if(ui->tableWidget->currentItem()->isSelected())
            ui->tableWidget->removeRow(ui->tableWidget->currentItem()->row());
}

void MenuWizard::on_btnCancel_clicked()
{
    close();
}

void MenuWizard::on_btnInfo_clicked()
{
    QMessageBox::information(this, tr("Aide"), tr("Cet assistant permet de saisir rapidement les menus proposés par vos scripts :\n- Cliquez sur l'icône (ou utilisez CTRL+N) correspondant pour insérer une nouvelle entrée.\n- Si vous souhaitez utiliser la commande \"menu\" et ses labels, saisissez des Labels. Sinon, laissez-les vides pour utiliser \"switch(select())\".\n\nConseil : Créez le nombre d'entrées nécessaire puis utilisez Tabulation pour passer de cellule en  cellule dans le tableau."), QMessageBox::Ok);

}

void MenuWizard::on_btnInsert_clicked()
{
    bool labeled = false;
    QStringList cases, labels;

    if(!checkTableContent())
    {
        QMessageBox::warning(this, tr("Menu invalide"), tr("Les entrées saisies semblent invalides :\n- Si un label a été saisi, tous doivent être saisis, pour la bonne utilisation de \"menu\".\n- Aucune entrée de menu ne doit être vide."));
        return;
    }

    for(int i = 0; i < ui->tableWidget->rowCount(); i++) // Déterminera si on utilise switch(select()) ou menu
    {
        if(!ui->tableWidget->item(i, 1)->text().isEmpty()) // L'utilisateur souhaite utiliser les labels (et donc "menu")
        {
            labeled = true;
            break;
        }
    }

    for(int i = 0; i < ui->tableWidget->rowCount(); i++)
    {
        cases << ui->tableWidget->item(i, 0)->text();

        // vérifie si le label n'a pas déjà été saisi
        if(labels.contains(ui->tableWidget->item(i, 1)->text()) && !(ui->tableWidget->item(i, 1)->text().trimmed().isEmpty()))
            QMessageBox::warning(this, tr("Menu invalide"), tr("Chaque label doit être unique...")+" ("+ui->tableWidget->item(i, 1)->text()+")");

        labels << ui->tableWidget->item(i, 1)->text();
    }

    inserted = true; /* ne proposera pas la sauvegarde à la fermeture */
    emit menuInserted(cases, labels, labeled);
}

bool MenuWizard::checkTableContent()
{
    bool labeled = false;

    for(int i = 0; i < ui->tableWidget->rowCount(); i++)
    {
        if(!ui->tableWidget->item(i, 1)->text().isEmpty()) /* L'utilisateur souhaite utiliser les labels (et donc "menu") */
            labeled = true;

        if(ui->tableWidget->item(i, 0)->text().isEmpty()) /* Tous les menus doivent avoir une entrée */
            return false;

        if(labeled && ui->tableWidget->item(i, 1)->text().isEmpty()) /* S'il y a UN label de saisi, tous doivent l'être */
            return false;
    }

    return true;
}
